package com.yt.order.service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.yt.order.common.utils.DistanceUtils;
import com.yt.order.common.utils.OperatorUtils;
import com.yt.order.common.utils.TencentMapGeocoder;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import javax.annotation.Resource;
import com.yt.order.common.config.YmlConfig;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.yt.order.mapper.EmpAddressMapper;
import com.yt.order.models.service.IEmpAddressService;
import com.yt.order.models.bo.EmpAddressSaveBO;
import com.yt.order.models.dto.EmpAddressDTO;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 员工地址表控制器
 *
 * @author zhou
 * @Date 2025-09-14 12:06:09
 */
@DubboService
public class EmpAddressServiceImpl extends ServiceImpl<EmpAddressMapper, EmpAddressDTO> implements IEmpAddressService{

    @Resource
    private YmlConfig ymlConfig;

    @Override
    public boolean add(EmpAddressSaveBO saveBO) {
        EmpAddressDTO dto = new EmpAddressDTO();
        BeanUtils.copyProperties(saveBO,dto);
        Long id = ymlConfig.getPkId();
        dto.setId(id);
        return this.insert(dto);
    }

    //筛选距离满足的员工id
    @Override
    public List<Long> queryGeoId(String address,String operator, String val) {
        BigDecimal value=new BigDecimal(val);
        //用于存储符合条件员工id列表
        List<Long> geoEmployeeId=new ArrayList<>();
        //查询所有员工位置上传信息
        Wrapper<EmpAddressDTO> wrapper=new EntityWrapper<EmpAddressDTO>();
        List<EmpAddressDTO> list=this.selectList(wrapper);
        for (EmpAddressDTO empAddressDTO:list) {
            //计算两地之间距离(参数1工单地址，参数2城市名(可以不要，不要则为null),参数3员工经度，参数4员工纬度
            BigDecimal distence= DistanceUtils.calculateDistance(address,null,empAddressDTO.getLatitude(),empAddressDTO.getLongitude());
            //进行距离和阈值判断
            boolean flag= OperatorUtils.compare(distence,operator,value);
            //返回true将员工id加入列表中
            if(flag){
                geoEmployeeId.add(empAddressDTO.getEmpId());
            }
        }
        return geoEmployeeId;
    }
}
